#include "led.h"


void set_Led_status(led_output_t out_value)
{
	Set_GPIO_bit_output(GPIO_PD, 5, 1);
	Set_GPIO_group_output(GPIO_PC, out_value.led_on_off[0]& 0x3f);	//PC0 ~ PC5
	Set_GPIO_group_output(GPIO_PD, (out_value.led_on_off[0] >> 6 ) & 0x03);
	Set_GPIO_bit_output(GPIO_PD, 5, 0);

	Set_GPIO_bit_output(GPIO_PD, 6, 1);
	Set_GPIO_group_output(GPIO_PC, out_value.led_on_off[1] & 0x3f);	//PC0 ~ PC5
	Set_GPIO_group_output(GPIO_PD, (out_value.led_on_off[1] >> 6 ) & 0x03);
	Set_GPIO_bit_output(GPIO_PD, 6, 0);

	Set_GPIO_bit_output(GPIO_PD, 7, 1);
	Set_GPIO_group_output(GPIO_PC, out_value.led_on_off[2] & 0x3f);	//PC0 ~ PC5
	Set_GPIO_group_output(GPIO_PD, (out_value.led_on_off[2] >> 6 ) & 0x03);
	Set_GPIO_bit_output(GPIO_PD, 7, 0);

	Set_GPIO_bit_output(GPIO_PB, 5, 1);
	Set_GPIO_group_output(GPIO_PC, out_value.led_on_off[3] & 0x3f);	//PC0 ~ PC5
	Set_GPIO_group_output(GPIO_PD, (out_value.led_on_off[3] >> 6 ) & 0x03);
	Set_GPIO_bit_output(GPIO_PB, 5, 0);	
}


/********************************************************************
*********************************************************************/
U16 led_task_tick[MAX_LED];
led_task_t 	led_task[MAX_LED];

led_output_t pre_outvalue, cur_outvalue;

void init_led_task(void)
{
	U8 i;
	for(i = 0; i <  MAX_LED; i ++)
	{
		led_task[i].type	=	ALWAYS_OFF;
	}

	for(i = 0 ; i < (MAX_LED / 8 ) ;i ++)
	{
		pre_outvalue.led_on_off[i] = 0;			// all off
		cur_outvalue.led_on_off[i] = 0;			// all off
	}

	set_Led_status(cur_outvalue);
}


/************************************************************************
process led every task tick(1ms)
*************************************************************************/
void process_led_task(void)
{
	U8 i , j , k, on_off;
	for( i = 0 ; i < MAX_LED; i++)
	{
		j = i / 8;
		k = i % 8;
		on_off = ((pre_outvalue.led_on_off[j] >> k ) & 0x01);
		
		if( led_task[i].type == ALWAYS_OFF)
		{
			cur_outvalue.led_on_off[j] &= (~(0x01 << k));
		}
		else if(led_task[i].type == ALWAYS_ON)
		{
			cur_outvalue.led_on_off[j] |= ((0x01 << k));
		}
		else if(led_task[i].type == FLASH)
		{
			if( led_task_tick[i] == 0)	//update delay time
			{
				if(on_off)	//switch to off this time
				{
					cur_outvalue.led_on_off[j] = (~(0x01 << k));
					led_task_tick[i] = ( led_task[i].flash == FLASH_STATUS0 ) ? led_task[i].OFF_delay_0 : led_task[i].OFF_delay_1;
				}
				else	//switch to ON this time
				{
					cur_outvalue.led_on_off[j] |= ((0x01 << k));
					led_task_tick[i] = ( led_task[i].flash == FLASH_STATUS0 ) ? led_task[i].ON_delay_0 : led_task[i].ON_delay_1;
				}				
			}
			else
			{
				led_task_tick[i] --;
			}
		}
	}

	set_Led_status(cur_outvalue);
	for(i = 0 ; i < (MAX_LED / 8); i ++)
	{
		pre_outvalue.led_on_off[i] = cur_outvalue.led_on_off[i] ;
	}
}
